www.gusucode.com > VC编写的串口调试软件 > VC编写的串口调试软件,内含Modbus协议类 支持对Modbus通讯调试/Modbus串口调试软件1.0/ComData.cpp
// ComData.cpp: implementation of the CComData class. // ////////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "ComData.h" #include <math.h> #ifdef _DEBUG #undef THIS_FILE static char THIS_FILE[]=__FILE__; #define new DEBUG_NEW #endif ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CComData::CComData() { // m_strRegType="0" ; //寄存器类型 // m_strRegAddr="0" ; //寄存器地址 // m_strRegCount="1"; //寄存器数量 m_strRegValue="00" ; //值 m_strOldRegValue="00"; m_unRegType=0; //寄存器类型 m_unRegAddr=0; //寄存器地址 m_unRegCount=1; //寄存器数量 m_unPriority=0 ; //标记 m_strNote="*"; m_unDataType=CComData::V_SN16; m_bReadWrite=true; //读写操作:1:Read;0:Write m_nDecimal=0; //小数点位:0----整型操作 m_unStationNum=-1; //站号---控制器站号 m_ucProtocalTxt[500]='\0'; //用于存放译码结果,如果是位读写,可能出现译码更新 m_unDataLen=0; //译码缓冲区有效长度 m_ucRcvTxt[500]='\0'; //用于存放接收信息 m_unRcvLen=0; //接收字符长度 m_unRcvBegin=0; //接收字符有效数值位置 m_unRcvCount=0; //接收字符有效数值长度 m_bTranstation=false; //true----已经译码 m_unReSend=0; //>0----要求再发送次数 m_unPriority=1; //标记:读数据 m_hClientWnd=NULL; //宿主窗口句柄 m_pReData=NULL; } CComData::CComData(CComData& Data) { // m_strRegType=Data.m_strRegType ; //寄存器类型 // m_strRegAddr=Data.m_strRegAddr ; //寄存器地址 // m_strRegCount=Data.m_strRegCount; //寄存器数量 m_unRegType=Data.m_unRegType; //寄存器类型 m_unRegAddr=Data.m_unRegAddr; //寄存器地址 m_unRegCount=Data.m_unRegCount; //寄存器数量 m_strRegValue=Data.m_strRegValue ; //值 m_strOldRegValue=Data.m_strOldRegValue ; //值 m_unDataType=Data.m_unDataType; //值---类型 m_unPriority=Data.m_unPriority ; //标记 m_strNote=Data.m_strNote ; //注释 m_bReadWrite=Data.m_bReadWrite; //读写操作 m_nDecimal=Data.m_nDecimal; //小数点位:0----整型操作 m_unStationNum=Data.m_unStationNum ; //站号---控制器站号 m_unDataLen=Data.m_unDataLen ; //译码缓冲区有效长度 m_unRcvLen=Data.m_unRcvLen; //接收字符长度 unsigned int n; for(n=0;n<m_unDataLen;n++) { m_ucProtocalTxt[n]=Data.m_ucProtocalTxt[n]; } for(n=0;n<m_unRcvLen;n++) { m_ucRcvTxt[n]=Data.m_ucRcvTxt[n]; } // strcpy((char*)m_ucProtocalTxt,(char*)Data.m_ucProtocalTxt); //用于存放译码结果,如果是位读写,可能出现译码更新 // strcpy((char*)m_ucRcvTxt,(char*)Data.m_ucRcvTxt); //用于存放接收 m_unRcvBegin=Data.m_unRcvBegin; //接收字符有效数值位置 m_unRcvCount=Data.m_unRcvCount; //接收字符有效数值长度 m_bTranstation=Data.m_bTranstation; //true----已经译码 m_unReSend=Data.m_unReSend ; //>0----要求再发送次数 m_strAlias=Data.m_strAlias ; //别名 m_hClientWnd=Data.m_hClientWnd; m_pReData=Data.m_pReData ; } CComData::~CComData() { } CComData& CComData::operator=(CComData& Data) { // m_strRegType=Data.m_strRegType; //寄存器类型 // m_strRegAddr=Data.m_strRegAddr; //寄存器地址 // m_strRegCount=Data.m_strRegCount; //寄存器数量 m_unRegType=Data.m_unRegType; //寄存器类型 m_unRegAddr=Data.m_unRegAddr; //寄存器地址 m_unRegCount=Data.m_unRegCount; //寄存器数量 m_strRegValue=Data.m_strRegValue; //值 m_strOldRegValue=Data.m_strOldRegValue ; //值 m_unDataType=Data.m_unDataType; //值---类型 m_unPriority=Data.m_unPriority ; //标记 m_strNote=Data.m_strNote ; //注释 m_bReadWrite=Data.m_bReadWrite; //读写操作 m_nDecimal=Data.m_nDecimal; //小数点位:0----整型操作 m_unStationNum=Data.m_unStationNum ; //站号---控制器站号 m_unDataLen=Data.m_unDataLen ; //译码缓冲区有效长度 m_unRcvLen=Data.m_unRcvLen; //接收字符长度 unsigned int n; for(n=0;n<m_unDataLen;n++) { m_ucProtocalTxt[n]=Data.m_ucProtocalTxt[n]; } for(n=0;n<m_unRcvLen;n++) { m_ucRcvTxt[n]=Data.m_ucRcvTxt[n]; } // strcpy((char*)m_ucProtocalTxt,(char*)Data.m_ucProtocalTxt); //用于存放译码结果,如果是位读写,可能出现译码更新 // strcpy((char*)m_ucRcvTxt,(char*)Data.m_ucRcvTxt); //用于存放接收 m_unRcvBegin=Data.m_unRcvBegin; //接收字符有效数值位置 m_unRcvCount=Data.m_unRcvCount; //接收字符有效数值长度 m_bTranstation=Data.m_bTranstation; //true----已经译码 m_unReSend=Data.m_unReSend ; //>0----要求再发送次数 m_strAlias=Data.m_strAlias ; //别名 m_hClientWnd=Data.m_hClientWnd; m_pReData=Data.m_pReData ; return *this; } BOOL CComData::IsBit() { if(V_BBIT==m_unDataType) return TRUE; return FALSE; } BOOL CComData::IsFloat () { return m_nDecimal; } bool CComData::IsReadWrite () { return m_bReadWrite; } bool CComData::SetReadWrite(bool bRW) { bool bOldReadWrite=m_bReadWrite; m_bReadWrite=bRW; return bOldReadWrite; } void CComData::SetRegister( unsigned int unRegAddr,int nStationNum/*=0*/) { m_unRegAddr=unRegAddr; m_unStationNum=nStationNum; } CString CComData::GetBit_Byte(CString strValue) //用于位写操作 { CString strNewValue; /* unsigned char cByte; cByte=unsigned char(atoi(strValue)); unsigned char cBit[8]; // m_strRegValue="1"; if(m_strRegValue=="1") { cBit[0]=0x01; cBit[1]=0x02; cBit[2]=0x04; cBit[3]=0x08; cBit[4]=0x10; cBit[5]=0x20; cBit[6]=0x40; cBit[7]=0x80; strNewValue.Format("%d",cByte | cBit[m_bBit]); } else //"0" { cBit[0]=0xFE; cBit[1]=0xFD; cBit[2]=0xFB; cBit[3]=0xF7; cBit[4]=0xEF; cBit[5]=0xDF; cBit[6]=0xBF; cBit[7]=0x7F; strNewValue.Format("%d",cByte & cBit[m_bBit]); } //*/ return strNewValue; } unsigned int CComData::GetRegister () { return m_unRegAddr; } CString CComData::GetValue(bool bFlash) { if(bFlash) { Transform(&m_ucRcvTxt[m_unRcvBegin],m_unRcvCount); } return m_strRegValue; } int CComData::GetValue() { /* V_B0,V_B1,V_B2,V_B3,V_B4,V_B5,V_B6,V_B7, V_SN8,V_SN16,V_SN32, //符号 V_UN8,V_UN16,V_UN32, //无符号 V_FV32, //浮点 V_SNF16,V_SNF32, //用整形数表示浮点(小数位由m_nDecimal确定) V_UNF16,V_UNF32, //用整形数表示浮点(小数位由m_nDecimal确定) V_CV //字符 if(m_bBit>=0) { unsigned char cByte; cByte=unsigned char(atoi(m_strRegValue)); cByte=cByte>>m_bBit; cByte=cByte&0x01; return cByte; } return atoi(m_strRegValue); //*/ return atoi(m_strRegValue); } void CComData::SetValue (CString strValue,bool bRW/*=true*/) { m_strRegValue=strValue; m_bReadWrite=bRW; //读 // TRACE("%s-----------%s\n",m_strRegister,m_strRegValue); } void CComData::Trace() { TRACE("% 6d=%s,bReadWrite=%d\n",m_unRegAddr,m_strRegValue,m_bReadWrite); } //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //名称: Transform------转换成十进制、十六进制、二进制 //---------------------------------------------------- //参数: unsigned char &pChar-------------数据数组 // unsigned int unLen---------------数据长度 // bool bBinary---------------------true:二进制传输;false:ASC码传输 // //---------------------------------------------------- //功能: 对发送数据进行译码 //---------------------------------------------------- //返回值: // void //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ void CComData::Transform(const unsigned char* pBuf, unsigned int unLen) { switch(m_unDataType) { case V_HEX: { Transform_Hex(pBuf,unLen); break; } case V_HEXASC: { Transform_HexAsc(pBuf,unLen); break; } case V_CV: { m_strRegValue.Empty (); for(int n=unLen-1;n>=0;n--) m_strRegValue.Insert (0,*(pBuf+n)); break; } default: { Transform_Binary(pBuf,unLen); } } m_strOldRegValue=m_strRegValue; } //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //名称: Transform------转换成十进制、十六进制、二进制 //---------------------------------------------------- //参数: unsigned char &pChar-------------数据数组 // unsigned int unLen---------------数据长度 // //---------------------------------------------------- //功能: 对发送数据进行译码 //---------------------------------------------------- //返回值: // void //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ void CComData::Transform_Hex(const unsigned char* pBuf, unsigned int unLen) {//如果是位操作,则应返回的是无符号整形(0-256) int nN=0; int nValue=0; for(unsigned int n=0;n<unLen;n++) { nValue+=pBuf[n]*int(pow( 256,unLen-1-n)); } //判断正负数 if(nN>127) { nValue-=int(pow( 16,unLen-0)); } m_strRegValue.Format ("%d",nValue); int nLen=m_strRegValue.GetLength (); if(0<m_nDecimal) {//有小数点 if(nLen>m_nDecimal) m_strRegValue.Insert (nLen-m_nDecimal,'.'); else //次数为<1.0的小数 { for(int n=0;n<m_nDecimal-nLen;n++) m_strRegValue.Insert (n,'0'); m_strRegValue.Insert (1,'.'); } } } void CComData::Transform_HexAsc(const unsigned char *pBuf, unsigned int unLen) { m_strRegValue.Empty (); CString strBHex; for(UINT nIndex=0;nIndex<unLen;nIndex++) { strBHex.Format ("%02x",pBuf[nIndex]); m_strRegValue+=strBHex; } return; for(unsigned int n=unLen-1;n>=0;n--) { unsigned char ucByte4H=(unsigned char)pBuf[n]>>4 & 0x0F; unsigned char ucByte4L=(unsigned char)pBuf[n] & 0x0F; if(ucByte4H>0x09) ucByte4H+='A'-0x0A; else ucByte4H+='0'; if(ucByte4L>0x09) ucByte4L+='A'-0x0A; else ucByte4L+='0'; m_strRegValue+=ucByte4H; m_strRegValue+=ucByte4L; } } //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //名称: Transform------转换成十进制、十六进制、二进制 //---------------------------------------------------- //参数: unsigned char &pChar-------------数据数组 // unsigned int unLen---------------数据长度 // //---------------------------------------------------- //功能: 对发送数据进行译码 //---------------------------------------------------- //返回值:-------暂不支持浮点数据 // void //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ void CComData::Transform_Binary(const unsigned char* pBuf, unsigned int unLen) //Binary { switch(m_unDataType) { case CComData::V_BBIT: { int nMoveByte=unLen-1-m_nDecimal/8; int nMoveBit=m_nDecimal%8; int nBit=*(pBuf+nMoveByte)>>nMoveBit & 0x01; m_strRegValue.Format("%d",nBit); break; } case CComData::V_SN8: { if(1==unLen) { int nValue=*pBuf; if(0x01==pBuf[0]>>8) { nValue=0xFF-nValue+1; } m_strRegValue.Format("%d",nValue); } break; } case CComData::V_SN16: { //高字节在前,低字节在后 //0x12 0x34 ----> 0x1234 if(2==unLen) { short nValue=pBuf[0]<<8|pBuf[1]; m_strRegValue.Format("%d",nValue); } break; } case CComData::V_SN32: { //低字在前,高字在后 //0x12 0x34 0x56 0x78----> 0x56781234 if(4==unLen) { int nValue=pBuf[0]<<8|pBuf[1]<<0|pBuf[2]<<24|pBuf[3]<<16; m_strRegValue.Format("%d",nValue); } break; } case CComData::V_UN8: { if(1==unLen) { unsigned int nValue=*pBuf; m_strRegValue.Format("%u",nValue); } break; } case CComData::V_UN16: { if(2==unLen) { //高字节在前,低字节在后 //0x12 0x34 ----> 0x1234 unsigned short nValue=pBuf[0]<<8|pBuf[1]; m_strRegValue.Format("%u",nValue); } break; } case CComData::V_UN32: { if(4==unLen) { //低字在前,高字在后 //0x12 0x34 0x56 0x78----> 0x56781234 unsigned int nValue=pBuf[0]<<8|pBuf[1]<<0|pBuf[2]<<24|pBuf[3]<<16; m_strRegValue.Format("%u",nValue); } break; } case CComData::V_FV32: { //位数 if(4==unLen) { // float fValue=(pBuf[0]<<24) | (pBuf[1]<<16) | (pBuf[2]<<8) | pBuf[3]; // m_strRegValue.Format("%f",fValue); } break; } case CComData::V_SNF16: //用整形数表示浮点(小数位由m_nDecimal确定) { if(2==unLen) { //高字节在前,低字节在后 //0x12 0x34 ----> 0x1234 int nValue=pBuf[0]<<8|pBuf[1]; if(0x01==pBuf[0]>>7) { nValue=-(0xFFFF-nValue+1); } double fValue=float(nValue/pow(10.f,m_nDecimal)); ToStrFloat(fValue,m_nDecimal); } break; } case CComData::V_SNF32: //用整形数表示浮点(小数位由m_nDecimal确定) { //低字在前,高字在后 //0x12 0x34 0x56 0x78----> 0x56781234 if(4==unLen) { int nValue=pBuf[0]<<24|pBuf[1]<<16|pBuf[2]<<8|pBuf[3]; double fValue=float(nValue/pow(10.f,m_nDecimal)); ToStrFloat(fValue,m_nDecimal); } break; } case CComData::V_UNF16: //用整形数表示浮点(小数位由m_nDecimal确定) { //高字节在前,低字节在后 //0x12 0x34 ----> 0x1234 if(2==unLen) { unsigned short nValue=pBuf[0]<<8|pBuf[1]; double fValue=float(nValue/pow(10.f,m_nDecimal)); ToStrFloat(fValue,m_nDecimal); } } case CComData::V_UNF32: //用整形数表示浮点(小数位由m_nDecimal确定) { //低字在前,高字在后 //0x12 0x34 0x56 0x78----> 0x56781234 if(4==unLen) { unsigned int nValue=pBuf[0]<<24|pBuf[1]<<16|pBuf[2]<<8|pBuf[0]; double fValue=float(nValue/pow(10.f,m_nDecimal)); ToStrFloat(fValue,m_nDecimal); } break; } default: { TRACE("CComData::Transform_Binary()-------数据转换不正确"); break; } } } istream& operator>>(istream &stream,CComData& Data) { char cAlias[100]; char cNote[500]; cAlias[0]='\0'; cNote[0]='\0'; if(CComData::m_unVersionNum<=VERSIONNUM0100) { stream>>cAlias //01、别名 >>Data.m_unStationNum //02、站号 >>Data.m_unRegType //03、寄存器类型 >>Data.m_unRegAddr //04、寄存器地址 >>Data.m_unRegCount //05、寄存器数量 >>Data.m_unDataType //06、数值类型 >>Data.m_nDecimal //07、小数点位 >>Data.m_unPriority //08、标记 >>cNote //09、注释 ; Data.m_strAlias.Format ("%s",cAlias); Data.m_strNote.Format ("%s",cNote); } return stream; } ostream& operator<<(ostream &stream,CComData& Data) { char cEnter[2]; cEnter[0]=10; cEnter[1]='\0'; if(CComData::m_unVersionNum<=VERSIONNUM0100) { stream<<cEnter <<Data.m_strAlias //01、别名 <<" " <<Data.m_unStationNum //02、站号 <<" " <<Data.m_unRegType //03、寄存器类型 // <<Data.m_strRegType //寄存器类型 <<" " <<Data.m_unRegAddr //04、寄存器地址 <<" " <<Data.m_unRegCount //05、寄存器数量 <<" " <<Data.m_unDataType //06、数值类型 <<" " <<Data.m_nDecimal //07、小数点位 <<" " <<Data.m_unPriority //08、访问优先级 <<" " <<Data.m_strNote //09、注释 ; } return stream; } void CComData::ToStrFloat(double fValue, int nDecimal) { switch(nDecimal) { case 0: m_strRegValue.Format("%.0f",fValue); break; case 1: m_strRegValue.Format("%.1f",fValue); break; case 2: m_strRegValue.Format("%.2f",fValue); break; case 3: m_strRegValue.Format("%.3f",fValue); break; default: m_strRegValue.Format("%.4f",fValue); } } void CComData::ReadMemData(CMemFile* pMemFile) { if(NULL==pMemFile) return; m_unRcvBegin =0; pMemFile->Read( &m_unRcvCount,sizeof(int)); pMemFile->Read((void*)&m_ucRcvTxt[0],m_unRcvCount); m_unRcvLen=m_unRcvCount; #ifdef _DEBUG CString strDebug; CString strC; for(unsigned int n=0;n<m_unRcvCount;n++) { strC.Format ("%x",m_ucRcvTxt[n]); strDebug+=strC; } // TRACE("CComData::ReadMemData()--%s:%s\n",m_strAlias,strDebug); #endif } void CComData::WriteMemData(CMemFile* pMemFile) const { if(NULL==pMemFile) return; char cValue[1024]; strcpy(cValue,m_strRegValue); int nLen=m_strRegValue.GetLength (); // char cLen[4]; // itoa(nLen,cLen,10); // pMemFile->Write( cLen,4); // pMemFile->Write( &m_unPriority,sizeof(int)); pMemFile->Write( &m_unRcvCount,sizeof(int)); // pMemFile->Write( (void*)cValue,nLen); pMemFile->Write((void*)&m_ucRcvTxt[m_unRcvBegin],m_unRcvCount); // TRACE("CComData::WriteMemData() %s--%d:%s\n",m_strAlias,nLen,cValue); } //版本号 UINT CComData::m_unVersionNum=VERSIONNUM0100; UINT CComData::m_unNewVersionNum=VERSIONNUM0100;